package com.marquis.cloud.common;

import io.jsonwebtoken.*;

import java.util.Calendar;

public class JWTUtils {

    /**
     * 获取token
     *
     * @param accountId 账户ID
     * @return
     */
    public static String getToken(String accountId) {
        // 令牌有效期1天
        Calendar cd = Calendar.getInstance();
        cd.add(Calendar.DATE, 1);
        // 生成令牌,参数可以自行组织
        return Jwts.builder()
                //设置用户ID
                .setSubject(accountId)
                //设置超时日期
                .setExpiration(cd.getTime())
                //SignatureAlgorithm.RS512:加密算法
                //CoreConstants.SECRET:加密解密的key
                .signWith(SignatureAlgorithm.HS512, Constants.KEY)
                .compact();
    }

    /**
     * 检查Token是否合法
     * @param token 令牌
     * @return JWTResult
     */
    public static JWTResult checkToken(String token) {
        try {
            Claims claims = Jwts.parser().setSigningKey(Constants.KEY).parseClaimsJws(token).getBody();
            String sub = claims.getSubject();
            return new JWTResult(true, sub, "合法请求", 200);
        } catch (ExpiredJwtException e) {
            // 在解析JWT字符串时，如果‘过期时间字段’已经早于当前时间，将会抛出ExpiredJwtException异常，说明本次请求已经失效
            return new JWTResult(false, null, "token已过期", 402);
        } catch (SignatureException e) {
            // 在解析JWT字符串时，如果密钥不正确，将会解析失败，抛出SignatureException异常，说明该JWT字符串是伪造的
            return new JWTResult(false, null, "token错误", 403);
        } catch (Exception e) {
            //其他
            return new JWTResult(false, null, "非法请求", 403);
        }
    }
}
